package Modelos;
import Escenario.*;


public class ModeloAceleracionFlujoLibre implements ModeloComportamiento{
	
	public EscenarioImpl aplicaModelo(EscenarioImpl esc, ParCV actual, Integer numCarril, Integer posParCV){
		
		double acelnueva = 0;
		double velnueva, velactual, velocidaddeseada, e, gamma, vinicial,incrementotiempo;
		double posactual, posnueva;
		
		velactual = actual.getEstadoActual().getVelocidad();
		posactual = actual.getEstadoActual().getPosicion();
		incrementotiempo = actual.getIncrementoTiempo();
		velocidaddeseada = actual.getConductor().getVelocidadDeFlujoLibre();
		e = Math.E;
		gamma = actual.getConductor().getGammaVdfl();
		vinicial = actual.getConductor().getVelocidadInicial();
		
		if(velactual<vinicial){
			acelnueva = actual.getVehiculo().getAmax();
		}else { if (velactual<velocidaddeseada){
					acelnueva = actual.getVehiculo().getAmax()*Math.pow((1-Math.pow(e, velocidaddeseada-velactual))/(1-Math.pow(e, velocidaddeseada)), gamma);		
				}
		}

		//controlamos que la aceleracion que obtenemos no sea mayor que la Amax del vehiculo
		if(acelnueva>actual.getVehiculo().getAmax()){
			acelnueva = actual.getVehiculo().getAmax();
		}
		//controlamos que la aceleracion que obtenemos no sea menor que la Amin del vehiculo
		if(acelnueva<actual.getVehiculo().getAmin()){
			acelnueva = actual.getVehiculo().getAmin();
		}
		
		velnueva = velactual + (acelnueva*incrementotiempo);		
		
		//controlamos que la velocidad que obtenemos no es mayor que la deseada
		if (velnueva>=velocidaddeseada){
				acelnueva = 0; //para que mantenga la velocidad actual 
				velnueva = velocidaddeseada; // por si se pasa un poco de la velocidad deseada, asi conseguimos estabilidad
		}
		
		posnueva = posactual + (velnueva*incrementotiempo + ((acelnueva*incrementotiempo*incrementotiempo)/2));
		
		actual.getEstadoNuevo().setAceleracion(acelnueva); 
		actual.getEstadoNuevo().setPosicion(posnueva); 
		actual.getEstadoNuevo().setVelocidad(velnueva);
		
		return esc;
	}

}